export default {
  telphone: (rule, value, callback) => {
    if (value === "") {
      callback();
      return;
    }
    const pass = /^(0[0-9]{2,3}-)?([2-9][0-9]{6,7})+(-[0-9]{1,4})?$/g.test(
      value
    );
    if (!pass) {
      callback(
        new Error(rule.message || "正确格式: 区号-电话号码 或 电话号码")
      );
    }
    callback();
  },
  phone: (rule, value, callback) => {
    if (value === "") {
      callback();
      return;
    }
    const pass = /^(\\+86)?0?[1][3456789][0-9]{9}$/g.test(value);
    if (!pass) {
      callback(new Error(rule.message || "请输入正确的电话号码"));
    }
    callback();
  },
  email: (rule, value, callback) => {
    if (value === "") {
      callback();
      return;
    }
    const pass = /^[a-zA-Z0-9_.-]+@([a-zA-Z0-9-]+\.)+[a-zA-Z0-9]{2,4}$/g.test(
      value
    );
    if (!pass) {
      callback(new Error(rule.message || "请输入正确的邮箱"));
    }
    callback();
  },

  postcode: (rule, value, callback) => {
    if (value === "") {
      callback();
      return;
    }
    const pass = /^\d{6}$/g.test(value);
    if (!pass) {
      callback(new Error(rule.message || "必须是6位数字"));
    }
    callback();
  },
  notValidInputText: (rule, value, callback) => {
    if (value === "") {
      callback();
      return;
    }
    const pass = /^[^'/\\"()@$%^*<>&?]*$/g.test(value);
    if (!pass) {
      callback(new Error(rule.message || "不能包含特殊字符^'\\\"()@$%^*<>&?*"));
    }
    callback();
  },
  isNumber: (rule, value, callback) => {
    if (value === "") {
      callback();
      return;
    }
    const pass = /^[0-9]*$/g.test(value);
    if (!pass) {
      callback(new Error(rule.message || "只能为数字"));
    }
    callback();
  },
  ip: (rule, value, callback) => {
    if (value === "") {
      callback();
      return;
    }
    const pass =
      /^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/g.test(
        value
      );
    if (!pass) {
      callback(new Error(rule.message || "请输入正确的ip地址"));
    }
    callback();
  },
  letterOrNumber: (rule, value, callback) => {
    if (value === "") {
      callback();
      return;
    }
    const pass = /^[0-9a-zA-Z]+$/g.test(value);
    if (!pass) {
      callback(new Error(rule.message || "只能是数字和字母"));
    }
    callback();
  },
  id: (rule, value, callback) => {
    if (value === "") {
      callback();
      return;
    }
    const pass = /^[a-zA-Z0-9-]{3,20}$/g.test(value);
    if (!pass) {
      callback(new Error(rule.message || "只能为 3-20 位字符串"));
    }
    callback();
  },
  number: (rule, value, callback) => {
    if (value === "") {
      callback();
      return;
    }
    const pass = /^[0-9]{1,10}$/g.test(value);
    if (!pass) {
      callback(new Error(rule.message || "必须是数字"));
    }
    callback();
  },
  positiveNumber: (rule, value, callback) => {
    if (value === "") {
      callback();
      return;
    }
    const pass = /^[0-9]\d*$/g.test(value);
    if (!pass) {
      callback(new Error(rule.message || "必须是正整数"));
    }
    callback();
  },
  posiNactiveNumber: (rule, value, callback) => {
    if (value === "") {
      callback();
      return;
    }
    const pass = /^[+-]?\d+(\.\d+)?$/g.test(value);
    if (!pass) {
      callback(new Error(rule.message || "可输入正数负数和小数"));
    }
    callback();
  },
  IDCard: (rule, value, callback) => {
    if (value === "") {
      callback();
      return;
    }
    if (!isIdCard(value)) {
      callback(new Error(rule.message || "请输入正确的身份证号码"));
    }
    callback();
  },
};
/**
 * 身份证15位编码规则：dddddd yymmdd xx p dddddd：6位地区编码 yymmdd: 出生年(两位年)月日，如：910215 xx:
 * 顺序编码，系统产生，无法确定 p: 性别，奇数为男，偶数为女
 * 
 * 身份证18位编码规则：dddddd yyyymmdd xxx y dddddd：6位地区编码 yyyymmdd:
 * 出生年(四位年)月日，如：19910215 xxx：顺序编码，系统产生，无法确定，奇数为男，偶数为女 y: 校验码，该位数值可通过前17位计算获得
 * 
 * 前17位号码加权因子为 Wi = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 ] 验证位
 * Y = [ 1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2 ] 如果验证码恰好是10，为了保证身份证是十八位，那么第十八位将用X来代替
 * 校验位计算公式：Y_P = mod( ∑(Ai×Wi),11 ) i为身份证号码1...17 位; Y_P为校验码Y所在校验码数组位置
 */
function isIdCard(idCard) {
	// 15位和18位身份证号码的正则表达式
	var regIdCard = /^(^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$)|(^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])((\d{4})|\d{3}[Xx])$)$/;
 
	// 如果通过该验证，说明身份证格式正确，但准确性还需计算
	if (regIdCard.test(idCard)) {
		if (idCard.length == 18) {
			var idCardWi = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10,
					5, 8, 4, 2); // 将前17位加权因子保存在数组里
			var idCardY = new Array(1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2); // 这是除以11后，可能产生的11位余数、验证码，也保存成数组
			var idCardWiSum = 0; // 用来保存前17位各自乖以加权因子后的总和
			for (var i = 0; i < 17; i++) {
				idCardWiSum += idCard.substring(i, i + 1) * idCardWi[i];
			}
 
			var idCardMod = idCardWiSum % 11;// 计算出校验码所在数组的位置
			var idCardLast = idCard.substring(17);// 得到最后一位身份证号码
 
			// 如果等于2，则说明校验码是10，身份证号码最后一位应该是X
			if (idCardMod == 2) {
				if (idCardLast == "X" || idCardLast == "x") {
					//alert("恭喜通过验证啦！");
					return true;
				} else {
					//alert("身份证号码错误！");
					return false;
				}
			} else {
				// 用计算出的验证码与最后一位身份证号码匹配，如果一致，说明通过，否则是无效的身份证号码
				if (idCardLast == idCardY[idCardMod]) {
					//alert("恭喜通过验证啦！");
					return true;
				} else {
					//alert("身份证号码错误！");
					return false;
				}
			}
		}else{
			return true;
		}
	} else {
		//alert("身份证格式不正确!");
		return false;
	}
}
